package org.facyt.vacas.utils;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.facyt.vacas.dto.DetalleRenglonDTO;
import org.facyt.vacas.dto.RecuentoDTO;
import org.facyt.vacas.entities.vacas.Alimento;
import org.facyt.vacas.entities.vacas.MateriaPrima;
import org.facyt.vacas.entities.vacas.Unidad;
import org.facyt.vacas.util.Constantes;


public class RecuentoDatos {

	public List listaMP;
	public List listaMPNoINtervienen;
	public List listaComposicion;
	public BigDecimal cantidadAlimento = BigDecimal.ZERO;
	public BigDecimal costoTotal = BigDecimal.ZERO;
	public BigDecimal costoXKg = BigDecimal.ZERO;
	public String animalNombre;
	//se utiliza para guardar los datos del vector X[] del simplex = resultado.
	public List listaComponenteVectorX;
	public Alimento alimento;
	
	
	public Alimento getAlimento() {
		return alimento;
	}
	public void setAlimento(Alimento alimento) {
		this.alimento = alimento;
	}
	public RecuentoDatos() {
		super();
		listaComposicion = new ArrayList();
		listaMP = new ArrayList();
	
	}
	public BigDecimal getCostoTotal() {
		return costoTotal;
	}
	public void setCostoTotal(BigDecimal costoTotal) {
		this.costoTotal = costoTotal;
	}
	public BigDecimal getCostoXKg() {
		return costoXKg;
	}
	public void setCostoXKg(BigDecimal costoXKg) {
		this.costoXKg = costoXKg;
	}
	public List getListaComposicion() {
		return listaComposicion;
	}
	public void setListaComposicion(List listaComposicion) {
		this.listaComposicion = listaComposicion;
	}
	public List getListaMP() {
		return listaMP;
	}
	public void setListaMP(List listaMP) {
		this.listaMP = listaMP;
	}
	public BigDecimal getCantidadAlimento() {
		return cantidadAlimento;
	}
	public void setCantidadAlimento(BigDecimal resultado) {
		this.cantidadAlimento = resultado;
	}
	public String getAnimalNombre() {
		return animalNombre;
	}
	public void setAnimalNombre(String animalNombre) {
		this.animalNombre = animalNombre;
	}
	//Metodo que obtiene de la lista de mp que intervienen en la formula,
	//la mp con id = id.
	public ArrayList getMPbyListaMpyId(int id) {
		
		boolean encontrado = false;
		String idmp = new Integer(id).toString();
		Iterator iter = getListaMP().iterator();
		while(iter.hasNext() && !encontrado)
		{
			ArrayList linea = (ArrayList) iter.next();
           	MateriaPrima mp = (MateriaPrima)linea.get(0);
           	if(new Long(mp.getId()).toString().equalsIgnoreCase(StringUtils.completarConCeros(idmp, 3)))
			{
				encontrado = true;
				return linea;
			}
		}
		
		return null;
	}
	
	//Metodo que obtiene de la lista de mp que NO intervienen en la formula,
	//la mp con id = id.
	public ArrayList getMPbyListaNoINtyId(int id) {
		boolean encontrado = false;
		
		String idmp = new Integer(id).toString();
		Iterator iter = getListaMPNoINtervienen().iterator();
		while(iter.hasNext() && !encontrado)
		{
			ArrayList linea = (ArrayList) iter.next();
           	MateriaPrima mp = (MateriaPrima)linea.get(0);
			if(new Long(mp.getId()).toString().equalsIgnoreCase(StringUtils.completarConCeros(idmp, 3)))
			{
				encontrado = true;
				return linea;
			}
		}
		
		return null;
	}
	public List getListaMPNoINtervienen() {
		return listaMPNoINtervienen;
	}
	public void setListaMPNoINtervienen(ArrayList listaMPNoINtervienen) {
		this.listaMPNoINtervienen = listaMPNoINtervienen;
	}
	public List getListaComponenteVectorX() {
		return listaComponenteVectorX;
	}
	public void setListaComponenteVectorX(ArrayList listaComponenteVectorX) {
		this.listaComponenteVectorX = listaComponenteVectorX;
	}
	public ArrayList getMPbyLista(int isa) {

		ArrayList l = getMPbyListaNoINtyId(isa);
		if(l != null)
			return l;
		
		l = getMPbyListaMpyId(isa);
		if(l != null)
			return l;
		else
			return null;
	}
	
	public RecuentoDTO toDto() {
		
		RecuentoDTO recuento = new RecuentoDTO();		
		
		List<DetalleRenglonDTO> lista = new ArrayList<DetalleRenglonDTO>();
		
		BigDecimal cantidadAElaborar = this.getCantidadAlimento();
		
		BigDecimal multiplicoX = new BigDecimal(1);
		if (cantidadAElaborar.compareTo(new BigDecimal(1000)) != 0)
			multiplicoX = cantidadAElaborar.divide(new BigDecimal(1000), Constantes.presicion, Constantes.redondeomode);
		
		Iterator iter = getListaMP().iterator();
		while(iter.hasNext())
		{
			ArrayList linea = (ArrayList) iter.next();
    
           	String st1 = toStringCodDescrip((MateriaPrima) linea
					.get(0));

			String unidad = ((MateriaPrima) linea.get(0)).getUnidad()
					.getDescripcion();
			BigDecimal cantidad = ((BigDecimal) linea.get(1)).multiply(multiplicoX);
			String cantidadMP = cantidad.toString();
			String st2 = StringUtils.getSimela(cantidadMP) + " "
			+ unidad;
			
			DetalleRenglonDTO renglon = new DetalleRenglonDTO();
			renglon.setDescripcion(st1);
			renglon.setCantidad(st2);
			
			lista.add(renglon);
      
		}
		
		recuento.setAnimal(this.getAnimalNombre());		
		recuento.setRenglones(lista);
		recuento.setCantidadAelaborar(cantidadAElaborar);
		
		
		return recuento;
		
	}
	
	public static String toStringCodDescrip(MateriaPrima materiaPrima) {
		return StringUtils.completarConCeros(
				new Long(materiaPrima.getId()).toString().trim(), 3).trim()
				+ " - " + materiaPrima.getDescripcion();
	}

	public static String getCostoXUnidadString(MateriaPrima materiaPrima) {
		Unidad unidadId = materiaPrima.getUnidad();
		if (unidadId != null && materiaPrima.getCosto().compareTo(BigDecimal.ZERO) >= 0) {
			return StringUtils.getSimela2decimales(materiaPrima
					.getCosto().toString()) + " " + "$" // GestorPresentacion.getInstance().getValor("frame.gestionrestricciones.pesos")
					+ "/" + unidadId.getDescripcion();
		} else
			return "";
	}
}
